/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package besa_adaptado;

import adaptation.AdapterAdminAES;
import adaptation.adapter.AdapterAgentStateAES;
import adaptation.common.ProfileAES;
import adaptation.common.adaptationmechanism.AdaptationMechanismAES;
import adaptation.common.filter.FilterAES;
import besa_adaptado.adaptador.Consulta;
import besa_adaptado.adaptador.MecanismoAdaptacion;
import besa_adaptado.adaptador.guardas.GuardRecieveQuery;
import besa_adaptado.filtros.FiltroDispositivo;
import besa_adaptado.filtros.FiltroExperiencia;
import besa_adaptado.filtros.FiltroLocalizacion;
import besa_adaptado.guardas.manejadorperfiles.GuardReceiveFilter;
import besa_adaptado.perfiles.PerfilDispositivo;
import besa_adaptado.perfiles.PerfilLocalizacion;
import besa_adaptado.perfiles.PerfilUsuario;
import besa_adaptado.restricciones.RestriccionDispositivo;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author Ayllu
 * Esta clase es la encargada de crear los agentes correspondientes al ejemplo
 */
public class CreadorEjemplo {
    
    private String laConsulta; //consulta que se va a enriquecer
    private PanelConsulta elFrame=null; //variable donde se almacenará el frame
    /**
     * 
     * @param laConsulta  La consulta a enriquecer
     */
    public CreadorEjemplo(String laConsulta) {
        this.laConsulta = laConsulta;
        this.elFrame = (PanelConsulta) PanelConsulta.getInstance();
    }
   

    public void lanzarEjemplo() {
        // Se crea la clase Adapter Admin BESA que es la clase que inicia la interacción entre los agentes
        // Recibe 2 parametros los cuales implementan los diferentes metodos necesarios para la adaptación:
        // GuardRecieveQuery implementa el selector de mecanismos de adaptación y la aplicación de restricciones
        // GuardReceiveFilter determina la forma en la que se obtendrán los perfiles de acurtdo al filtro seleccionado
        AdapterAdminAES adm = new AdapterAdminAES(GuardRecieveQuery.class, GuardReceiveFilter.class);
  
        AdapterAgentStateAES adapterState = new AdapterAgentStateAES(); //Creación del estado del agente adaptador
        llenarEstadoAdaptador(adapterState); //metodo que llena el estado del adaptador
        adm.createAdapterAgent(adapterState,null,null); //creación del agente adaptador con ek estado de dichoa gente
        adm.createProfileManager(); //creación del manejador de perfiles

        Consulta consulta = new Consulta(this.laConsulta); //Creacion de consulta a enriquecer 
        llenarConsulta(consulta); //Creacion del contexto de la ocnsulta tomando en cuenta los elementos seleccionados
        adm.launchQuery(consulta); //lanzar el adaptador

    }
    /**
     * 
     * @param property el nombre de la propiedad a cargar desde el archivo de propiedades
     * @return La propiedad solicitada
     */
    public String loadCategory(String property) {
        Properties props = new Properties(); //llamado a la clase properties de java
        try {
            props.load(new FileInputStream("res/adaptationCategories.properties")); //carga del archivo de propiedades
        } catch (IOException ex) {
            Logger.getLogger(CreadorEjemplo.class.getName()).log(Level.SEVERE, null, ex);
        }
        return props.getProperty(property); //lectura de la propiedad
    }
    /**
     * 
     * @param estado El estado del adaptador a llenar.
     */
    private void llenarEstadoAdaptador(AdapterAgentStateAES estado) {
        List<AdaptationMechanismAES> mecanismos = new ArrayList<AdaptationMechanismAES>(); //Arreglo que almacena los mecanismos de adaptación
        List<FilterAES> filtros = new ArrayList<FilterAES>(); //Lista de filtros a ser aplicados
        String tema[] = laConsulta.split(" "); //El tema de consulta para el ejemplo
        FiltroDispositivo f_disp = new FiltroDispositivo(loadCategory("device")); //creacion del filtro tipo dispositivo
        f_disp.addSubCategory("resolucion"); // Sub - categoria del filtro que será utilizada en el perfil
        FiltroExperiencia f_exp
        =  new FiltroExperiencia(loadCategory("user"), tema[1]); // Creacion del filtro de experiencia de usuario
        f_exp.addSubCategory("experticias"); //Sub categoria de experticias para el filtro de usuario
	f_exp.addSubCategory("grado"); //Sub categoria de experticias para el filtro de usuario
        FiltroLocalizacion f_loc 
        =  new FiltroLocalizacion(loadCategory("location"));  //Creacion del filtro de localización
        f_loc.addSubCategory("conectividad");//Sub categoria de experticias para el filtro de localizacion
        
        // poblando lista de filtros
        filtros.add(f_disp); 
        filtros.add(f_exp);
        filtros.add(f_loc);


        //Creación del mecanismos de adaptación y adición de filtros correspondientes
        MecanismoAdaptacion mecanismo1= new MecanismoAdaptacion();
        mecanismo1.putFilter(filtros.get(0));
        mecanismo1.putFilter(filtros.get(1));
        mecanismo1.putFilter(filtros.get(2));

        MecanismoAdaptacion mecanismo2 = new MecanismoAdaptacion();
        mecanismo2.putFilter(filtros.get(0));
        mecanismo2.putFilter(filtros.get(2));

        MecanismoAdaptacion mecanismo3 = new MecanismoAdaptacion();
        mecanismo3.putFilter(filtros.get(1));
        mecanismo3.putFilter(filtros.get(2));

        //Poblando la lista de mecanismos de adaptación
        mecanismos.add(mecanismo1);
        mecanismos.add(mecanismo2);
        mecanismos.add(mecanismo3);
        //Añadir mecanismos y filtros al estado del adaptador
        estado.setAdaptationMechanisms(mecanismos);
        estado.setFilters(filtros);
    }

    private void llenarConsulta(Consulta consulta) {
        /**
         * Contexto llenado con lo seleccionado en el panel de consulta
         */
        ArrayList<ProfileAES> context = new ArrayList<ProfileAES>();
        PerfilDispositivo disp = new PerfilDispositivo(loadCategory("device"));
        disp.setNombre(this.elFrame.getJcbDispositivo().getSelectedItem().toString());


        PerfilUsuario usu = new PerfilUsuario(loadCategory("user"));
        usu.setNombre(this.elFrame.getJcbUsuario().getSelectedItem().toString());

        PerfilLocalizacion loc = new PerfilLocalizacion(loadCategory("location"));
        loc.setNombre(this.elFrame.getJcbLocalizacion().getSelectedItem().toString());
        //agregando la información al contexto
        context.add(disp);
        context.add(usu);
        context.add(loc);
        /**
         * Restricciones
         */
        ArrayList<ProfileAES> restrictions = new ArrayList<ProfileAES>();

        /** Restriccion es use o no use X Filtro*/
        RestriccionDispositivo restdisp = new RestriccionDispositivo(loadCategory("location"));
        restdisp.setFormato("PDF");
        //restdisp.putProfileInfo("Formato", new InfoPerfil("PDF"));

        restrictions.add(restdisp);

        consulta.setContext(context);
        consulta.setRestrictions(restrictions);


    }
}
